--简易锁的加锁lua
--锁存在，则直接加锁失败；如果不存在，则加锁并且设置过期的时间
if redis.call("exists", KEYS[1]) == 0 then
    redis.call("set", KEYS[1], ARGV[1])
    redis.call("pexpire", KEYS[1], ARGV[2])
    return 1;
else
    return 0;
end


--eval "if redis.call(\"exists\", KEYS[1]) == 0 then redis.call(\"set\", KEYS[1], ARGV[1]) redis.call(\"pexpire\", KEYS[1], ARGV[2]) return 1 else return 0  end" 1 lockName uuid 30000

--简易锁的释放锁
--锁不存在，直接return，如果存在，则判断是不是本线程的uuid，是则删除锁，不是则return

if (redis.call("exists", KEYS[1]) == 0) then
    return 0
end

if (redis.call("get", KEYS[1])) == ARGV[1] then
    redis.call("del", KEYS[1])
    return 1
else
    return 0
end

--eval "if (redis.call('exists', KEYS[1]) == 0) then return 0 end if (redis.call('get', KEYS[1])) == ARGV[1] then redis.call('del', KEYS[1]) return 1 else return 0 end" 1 lockName uuid


--使用hash实现可重入锁的lua脚本
--判断锁是不是存在，如果锁不存在，则是set一个hash，hKey==lockName，key== uuid，value==冲入次数，再设置一个过期时间
--锁存在，判断uuid是不是本线程，是的话次数+1，不是的话，直接return

if (redis.call('exists', KEYS[1]) == 0) then
    redis.call('hincrby', KEYS[1], ARGV[1], 1)
    redis.call('pexpire', KEYS[1], ARGV[2])
    return 1
end
if (redis.call('hexists', KEYS[1], ARGV[1]) == 1) then
    redis.call('hincrby', KEYS[1], ARGV[1], 1)
    redis.call('pexpire', KEYS[1], ARGV[2])
    return 1
else
    return 0
end

--eval "if (redis.call('exists', KEYS[1]) == 0) then redis.call('hincrby', KEYS[1], ARGV[1], 1) redis.call('pexpire', KEYS[1], ARGV[2]) return 1 end if (redis.call('hexists', KEYS[1], ARGV[1]) == 1) then redis.call('hincrby', KEYS[1], ARGV[1], 1) redis.call('pexpire', KEYS[1], ARGV[2]) return 1 else return 0 end" 1 lockName uuid 60000


--可重入锁的释放锁lua脚本
--判断当前锁是不是本线程持有，不是的话，直接return
--是的话重入次数进行-1，-1后大于0，设置锁的过期时间
--否则删除锁

if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then
    return 0
end
local lockCount = redis.call('hincrby', KEYS[1], ARGV[1], -1)
if (lockCount > 0) then
    redis.call('pexpire', KEYS[1], ARGV[2])
    return 1
else
    redis.call('del', KEYS[1])
    return 1
end

--eval "if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then return 0 end local lockCount = redis.call('hincrby', KEYS[1], ARGV[1], -1) if (lockCount > 0) then redis.call('pexpire', KEYS[1], ARGV[2]) return 1 else redis.call('del', KEYS[1]) return 1 end" 1 lockName uuid 30000

--lua脚本实现自动续期
--判断当前锁是不是本线程持有，如果不是就return,如果是就进行锁续期

if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then
    return 0
else
    redis.call('pexpire', KEYS[1], ARGV[2])
    return 1
end

--eval "if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then return 0 else redis.call('pexpire', KEYS[1], ARGV[2]) return 1 end" 1 lockName uuid 30000
